概要
Spring Web Flow は、ステートフルな対話形式のWebアプリケーションを簡単に書き込む方法を提供しているSpring FrameworkのWebアプリケーションスタックの構成要素です。Spring Web Flowは、他のアプリケーションと関係なく設定され再利用される内蔵タイプのモジュールとして定義することで、Webアプリケーションの論理的な流れを一級市民(1st Class Citizen)にします。
Spring Web Flow は、ステートフルなデータ、つまり、要求、速報、流れ、会話などに対するさまざまな適用範囲を導入することで、ステートフルなWebアプリケーションを開発する新しい方法を提供しています。また、これは、アプリケーション状況の管理方法をカスタマイズするための機能拡張の要点も提供しています。
Terracotta for Spring は、多数のJVMにわたってクラスタ化することで、Springを基本にしたアプリケーションの利用頻度を高めるランタイムです。この製品は、適用範囲に関係なく、(一般にSpring Beanだけでなく)Spring Web Flowのためのトランスペアレントで宣言型のクラスタ化を直接サポートします。
この記事では、最初にSpring Web FlowとTerracotta for Springの概要を述べ、その後、ステートフルで、対話型のスケーラブルな高可用性Webアプリケーションを書き込みできる新しい特質を登録するために、これらの技術を統合的に用いる方法を示します。
Spring Web Flowとは何か
Spring Web Flow は、ステートフルな対話型のWebアプリケーションを簡単に書き込む方法を提供しているSpring FrameworkのWebアプリケーションスタックの構成要素です。Spring Web Flowは、他のアプリケーションと関係なく設定され、再利用された内蔵タイプのモジュールとして定義することで、Webアプリケーションでの論理的な流れを一級市民nにします。これは、フレームワークを限定せず、一般に好まれるWebアプリケーションフレームワーク、たとえば、Spring MVCやStruts、あるいは、JSFなどのフレームワークで手軽に利用されています。
ページフローを定義し構成するタスクのために特別に開発されたドメイン特化言語(DSL)を利用して、ページフローが構成されます。現在のインプリメンテーションはXMLとJavaです。
Spring Web Flowによって、ステートフルなデータ、すなわち、いろいろな利用事例や要件に適合する要求や速報、流れ、会話などに対するさまざまな適用範囲を導入して処理状況が把握できるWebアプリケーションを開発するときに、柔軟性とパワーが与えられます。
リリース1.0の非常に興味深い特徴の簡単な概要を以下に示します(InfoQのリリースノートより)(参考記事・英語)。
- 多くの場所にわたってその論理を分散せずに、検索プロセスなどのようなアプリケーションタスク用制御機構論理すべてを一箇所で定義する。
- 簡単な部分から価値ある制御機構モジュールを作るために、全体的なフローを組み立てる。
- 詳細なif/else文ブロックをコーディングすることなく、自然なオブジェクト指向のリニア・プログラミングモデルで厳密なユーザーナビゲーション規則を実施する。
- フローが終わる、あるいは、失効するとき、フローを実行している間に割り付けられたメモリーが自動的にメモリー自身をクリーンにする。
- 最適な貴社ベースのWebフレームワークを用いたServlet環境で実行するために、フローを配布する。
- フロー定義の変更を必要とすることなく、基本Webフレームワーク(たとえば、Struts、Spring MVC、JSF、他)を変更する。
- 同時に環境を変更し、フロー定義の変更を必要とせずに、たとえば、JUnit試験からPortletに進む。
- コンテナを再起動することなしに、開発している時にオンザフライでアプリケーションのナビゲーション規則を発展させる。
- 特注のコーディングがない的確なブラウザボタンのサポート(戻る、送る、復元する)を受け入れる。
- 4つの管理された適用範囲、すなわち、それぞれ明確な意味を持つ、要求、速報、フロー、会話のどれかにタスクデータを保持する。
- コンテナなしで、切り離してフローを試験する。配布する前に、アプリケーション制御論理が正常に機能していることを確認すること。
- Spring IDE 2.0で、フローナビゲーション論理を図表を用いて視覚化し、編集する。
面白そうですか?今までのところは概念と理論だけでしたが、これがすべて実際にどのような結果になるかすぐ調べて見ましょう。それでは、そのままこの問題に注目しましょう。
企業でのスケールアウトと高可用性の必要性
クラスタ化が、企業向けアプリケーション開発の世界でますます重要になっています。従って、以下に示すような課題に引き続き開発者が取り組む必要があります。
- 単一ノードの他にアプリケーションを拡大してスケーラビリティを強化するにはどうすればよいか。
- どのようにすれば、高可用性を保証し、ユーザーの単一障害点を排除し、SLA(サービスレベル合意書)を満たしていることを確認できるか。
予想能力と高可用性は、ビジネスを支援するために、製造されたアプリケーションが示す必要がある操作上の特性です。いくつかの会社で、アプリケーションに99.9999パーセントにもなる動作可能時間が求められています。その他の会社ではそこまで求めていませんが、SLAで規定され、本予想方法で動作するアプリケーションを開発することが99.9999%レベルと同様に99.9%レベルでも非常に難しい限り、アプリケーションすべてを操作可能な状態にしておく必要があります。
これまで、クラスタ化は解決するのが難しい問題でした。Spring Web Flowや一般のアプリケーションとの関連で、特にこのことは、高性能であり信頼出来る方法でユーザーの状況を確実に高可用性にし、フェイルオーバーすることを意味しています。ノード接続に失敗した場合は(アプリケーションサーバ、または、JVMのクラッシュ)、面倒なセッション(これは、もっとも一般的な方法で、ロードバランサを設定する方法が好まれる)を用いることから始まりますが、スムーズな方法で1つのノードから別のノードへユーザーの状態を移動させる効率的な方法も必要です。
クラスタ化を言うときは何を意図し、キャッシングとはどんな違いがあるのでしょうか。我々が利用しているクラスタ化の定義は、多数のJVMアプリケーションにわたるアプリケーション状態を共有することですが、一方、キャッシングは、アプリケーションの状態を実行状態にさらに近づけることとして定義できます。そういう意味では、キャッシングはクラスタ化の一部です。
Web企業アプリケーションとして、企業レベルでのクラスタ化ソリューションが満足するべきと考える一連の最小要件としては、以下の項目があります。
- スケーラビリティ
- 高可用性
- フェイルオーバー
- 性能
- 既存コードへの最小限の影響
- 単純配置と設定状況
- ランタイム可視性(モニタリング)
では、この一見共通点のないように思えるニーズすべてを解決することに焦点を当ててみましょう。問題を解決している方法が常に複数あり、Webアプリケーションに高可用性を提供していると断言している製品が市場には多くあります。Terracottaはそのようなソリューションの1つを実現しています。
Terracotta for Springとは何か
Terracotta for Spring は、Springを基本にしたアプリケーション用のランタイムで、このランタイムは、Springアプリケーションに対して、アプリケーションコードへの影響がわずかであり、配置や設定過程への影響も同じようにほとんどない、トランスペアレントで高性能なクラスタ化を実現しています。直接アプリケーションをクラスタ化するのではなく、アプリケーション下のヒープレベルでクラスタ化することで、これが実行されます。
開発者は、ステートレスなアプリケーションに相対するものとして、単一ノードのステートフルなSpringアプリケーションを開発することができます。これによって、スケーラブルなアプリケーションに対して、最初にクラスタ化を設計する必要がなくなります。しかし、アプリケーションがアプリケーションを大きく拡大する必要がある場合や、あるいは、高可用性やフェイルオーバーを確保する必要がある場合には、分類統合したいと思う、Terracotta設定ファイルであるアプリケーションコンテキスト内のどれかのSpring Beanを簡単に定義する必要があります。そして、Terracotta for Springは、このアプリケーションがトランスペアレントに自動で分類統合され、単一ノード上のようにクラスタのどこでも同じ動作が保証されていることを確認します。
Spring Web Flowの場合、実質的にはさらに簡単です。Webアプリケーション状態と分類統合された継続レジストリを確保するためにユーザーが実行しなければならないことは、Terracotta設定ファイルの‘セッションサポート’をオンにして、規定のWebアプリケーションを宣言することだけです(詳細については、下記の「宣言型設定」の題名の付いた項目を参照ください)。
高度な見方をすると、Terracotta for Springは、以下のことを実現しています。
- HTTPセッション状態のクラスタ化 Spring Web Flowのユーザー状況と継続リポジトリか、あるいは、HTTPセッションに利用されるあらゆるその他の状態のための、高可用性やフェイルオーバーを確保してください。
- Spring Beanのクラスタ化 Spring Beanに対するライフサイクルの意味と適用範囲は、同じ"論理的な"ApplicationContextの範囲内にあるクラスタのあらゆるところで保護されます。現在のクラスタ化が可能なBeanタイプは、単集合のものとセッションが精査したBeanです。ユーザーは、分類統合するために、アプリケーションコンテキストのどれかのBeanを宣言的に設定することができます。
- POJOをトランスペアレントに分類統合する 既存コードを変更する必要は何もなく、ソースコードを要求することすらありません。このアプリケーションは、最小限の宣言型XML設定を基本にして、ロードするときにトランスペアレントに取り込まれます。Terracotta for Springは、どんなクラスも必要とせずにSerializable、または、 Externalizableや、その他のあらゆるインターフェースを実行します。直列化を利用していないのでこれが可能ですが、実際の差分(変更したデータ)を現時点でそのデータが必要なノードに送り出すだけです(ゆったりと)。
- 仮想メモリー管理 分散した不要データを収集したり、仮想ヒープ、たとえば、要求原理の基づいた物理メモリーはページインしたりページアウトしたりされるので、4GのRAMを持つマシン上で200GヒープのWebアプリケーションを走らせることができるような、仮想ヒープとしての機能もこれは備えています。この意味するところは、Spring Web Flowが物理的なヒープサイズを越えた対話型のデータのサイズであっても、心配する必要は何もないということです。
ヒープレベルのクラスタ化
Terracotta for Spring は、アスペクト指向技術を利用して、クラスをロードするときにアプリケーションを適合させています。この段階では、オブジェクト参照やスレッド調整、不要データ収集などを含め、Javaの動作が正しくクラスタにわたって保持されることを確保するために、アプリケーションが拡張されます。
また、以前にTerracotta は直列化を利用していないと述べました。これは、Spring Web Flowで保持されるあらゆる会話は、そのクラスタにわたって共有されることを意味します。これがまた意味することは、Terracottaは、会話状態のためにすべてのノードにオブジェクト全体のグラフを送りませんが、純粋なデータにグラフを分解し、電線に事実上の変化分である実際の"差分"を送るだけです。このデータは、他のノードには"陳腐"なものです。
Terracottaには、各ノード上で誰が誰を参照しているかの軌跡を保存する中央コーディネータがあるので(下記を参照)、遅延方式で動作でき、"汚れた"オブジェクトを参照して、変化分を必要とするノードにその変化分だけ送ることができます。これが参照の局所性を利用し、ロードバランサが"面倒なセッション"を使用するために設定されれば、なおさら効率的になるのは、いくつかのデータが実際のセッションを残す必要が決してなく、別のノードに複写される、と言うことを指しているからです。
構造は、ハブとスポーク(クライアントを管理する中央コーディネータがあることを意味する)に基づいています。この場合のクライアントは、ただ単にTerracotta for Springランタイムに加えられた普通のアプリケーションです。コーディネータは単一障害ではありませんが、任意の数の待機可能なコーディネータを持つことができ、障害が起きると、選択された一つが、クラッシュした主コーディネータが止まったまさにそこを捕まえます。また、クライアントとは関係なくコーディネータをクラスタ化することで、そのスケールを変えることができます。
高度な利用が可能でステートフルなWebアプリケーションを書き込む方法
ここで、Sellitemを呼び出すサンプルアプリケーションを用いて議論を推し進め、以下に示す項目について説明しましょう。
- Spring Web Flowを用いてステートフルな対話型のWebアプリケーションを書き込む方法。
- Terracotta for Springを用いて宣言的にステートフルなアプリケーションを分類統合する方法。
Sellitemサンプルアプリケーションは、Spring Web Flowディストリビューションから入手できる試用版です(詳しくは、この記事の終わりにある「リソース」項を参照ください)。
Spring Web Flowを用いたステートフルなWebアプリケーション、Sellitemを実行方法
Sellitemサンプルアプリケーションは、条件付遷移や対話型の適用範囲、フロー実行時の出力先変更、継続などの組み合わせを具体的に示しています。ユーザーは、数ページほど手引きされ、品目の価格や売り物の種目数、値引率、詳細な配送(必要であれば)を特定し、最後にすべての情報を見ることができます。
このアプリケーションのソースコードすべての順を追うことはできないでしょうが、(ページフローのためのSpring Web Flow DSLのXML版を用いて)ページフローを定義する方法だけでなく、Spring Web Flowがエクスポートするさまざまな標準サービス(Bean)を設定する方法に関する重要な概念を説明することに焦点をあてましょう。
Spring MVCにあるDispatcherServletの設定方法
このアプリケーションの入口点は、Spring MVCにある標準DispatcherServletです。これは、Web.xmlに登録され、以下に示すように、Webアプリケーションコンテキストの*.htmリソースに対応付けされます。:
<servlet>
<servlet-name>sellitem</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/sellitem-servlet-config.xml
/WEB-INF/sellitem-webflow-config.xml
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>sellitem</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
DispatcherServletの設定は、Spring 設定ファイルのsellitem-servlet-config.xmlとsellitem-webflow-config.xmlに存在します。sellitem-servlet-config.xmlの内部は、以下に示すSpring Web Flowシステム(この入口点はフローエグゼキュータです)の"/pos.xml"URLにすべての要求を配布するこのURLに対応付けされた単独のコントローラです。
<bean name="/pos.htm" class="org.springframework.webflow.executor.mvc.FlowController">
<property name="flowExecutor" ref="flowExecutor" />
</bean>
フローエグゼキュータとフローレジストリBeanの設定
"/WEB-INF/flows/"ディレクトリにあるXMLベースのフロー定義を実行するflowRegistry Beanを利用するために、flowExecutor Spring Beanを設定します。
<flow:executor id="flowExecutor" registry-ref="flowRegistry"/>
<flow:registry id="flowRegistry">
<flow:location path="/WEB-INF/flows/**-flow.xml" />
</flow:registry>
ページフローの定義
他の論理は、flowRegistry Beanに登録したフロー定義で定義されています(前述の「フローエグゼキュータとフローレジストリBeanの設定」項を参照ください)。
フロー実装の詳細を探求する前に、最初にページフロー用の図表による状態図を調べて見ましょう(下記を参照ください)。
上図によって、完了するまでフローは各段階を通り、販売のために配送が必要かどうかを決める決定段階があることが分かります。
上記のナビゲーション規則(そして、何の動作もしていませんが)をそのまま実行する最初の優れたフロー定義が以下に示されています。
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-1.0.xsd">
<var name="sale" class="org.springframework.webflow.samples.sellitem.Sale"/>
<start-state idref="enterPriceAndItemCount"/>
<view-state id="enterPriceAndItemCount" view="priceAndItemCountForm">
<transition on="submit" to="enterCategory"/>
</view-state>
<view-state id="enterCategory" view="categoryForm">
<transition on="submit" to="requiresShipping"/>
</view-state>
<decision-state id="requiresShipping">
<if test="${flowScope.sale.shipping}" then="enterShippingDetails" else="finish"/>
</decision-state>
<view-state id="enterShippingDetails" view="shippingDetailsForm">
<transition on="submit" to="finish"/>
</view-state>
<end-state id="finish" view="costOverview"/>
</flow>
分かっていただけると思いますが、上図での定義には、状態図での状態に対応している状態と、図中の矢印に対応している変化があります。"販売"のBeanは、このフローの実行をするときに配置されるフローインスタンス変数です。これは、販売に関する属性のためのホルダーです。
前述の定義は、きれいに揃えられたナビゲーション論理すべてを持っていますが、まだ、あらゆるアプリケーションを動作させる必要があります。特に、ユーザー発行イベント上でSale Beanを更新する論理は、書き込みされていません。さらに、最終段階での販売処理論理が定義されていません。
必要な動作すべてを実行する完成したSpring Web Flow定義が以下に示されています。
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-1.0.xsd">
<var name="sale" class="org.springframework.webflow.samples.sellitem.Sale"/>
<start-state idref="enterPriceAndItemCount"/>
<view-state id="enterPriceAndItemCount" view="priceAndItemCountForm">
<render-actions>
<action bean="formAction" method="setupForm"/>
</render-actions>
<transition on="submit" to="enterCategory">
<action bean="formAction" method="bindAndValidate">
<attribute name="validatorMethod" value="validatePriceAndItemCount"/>
</action>
</transition>
</view-state>
<view-state id="enterCategory" view="categoryForm">
<transition on="submit" to="requiresShipping">
<action bean="formAction" method="bind"/>
</transition>
</view-state>
<decision-state id="requiresShipping">
<if test="${flowScope.sale.shipping}" then="enterShippingDetails" else="processSale"/>
</decision-state>
<view-state id="enterShippingDetails" view="shippingDetailsForm">
<transition on="submit" to="processSale">
<action bean="formAction" method="bind"/>
</transition>
</view-state>
<action-state id="processSale">
<bean-action bean="saleProcessor" method="process">
<method-arguments>
<argument expression="flowScope.sale"/>
</method-arguments>
</bean-action>
<transition on="success" to="finish"/>
</action-state>
<end-state id="finish" view="costOverview">
<entry-actions>
<action bean="formAction" method="setupForm"/>
</entry-actions>
</end-state>
<import resource="sellitem-beans.xml"/>
</flow>
現時点で、ナビゲーション論理の定義に加え、このフローは、実行を定義して、適時、適切なアプリケーション動作を呼び出します。これには、ユーザー発行イベントを処理するための論理が含まれ、販売を処理するために後置されている販売処理プログラムが呼び出されます。
結合の形成と妥当性確認
形式を表示するビューステートを入力するとき、フローは、FormActionコマンドBeanを呼び出し、型式設定を実行し、論理を発行します。発行の際、FormActionは、ユーザーが要求するパラメータを適合する販売属性に結びつけ、それらの確認も行う場合があります。
<bean id="formAction" class="org.springframework.webflow.action.FormAction">
<property name="formObjectName" value="sale"/>
<property name="validator">
<bean class="org.springframework.webflow.samples.sellitem.SaleValidator"/>
</property>
</bean>
詳細について
Spring Web Flowの完全コードと資料や、10個のサンプルアプリケーション(Sell Itemを含む)は、Spring Webサイト、 http://www.springframework.org/webflow (英語)にあります。
Sellitemアプリケーションのクラスタ化
ところで、Spring Web Flowを用いた対話型のWebアプリケーションを実行する方法が分かっています。それなら、もう少し楽しんで、トランスペアレントな耐故障性を実現し、クラスタノードのどこでも状態を共有するために、Terracotta for Springで分類統合する方法を理解して、どのようにすれば、サンプルアプリケーションの高可用性やフェイルオーバーを有効にできるかを調べてみましょう。
難しそうですか。それでは、実際にまったく簡単だと分かっていただけるのであれば。
宣言型設定
Sellitem サンプルアプリケーションは、Scaleクラスのインスタンスを利用して現在の販売に対するすべての会話データを記憶します。また、Spring Web Flow's flowのフロー実行リポジトリは、HTTPセッションを利用してすべての会話データを記憶します。
Terracotta for Springを有効にするためには、既知のWebアプリケーションに対してHTTPセッションのクラスタ化が可能であることが明確にされ、計装用として、場合によればHTTPセッションに記憶される可能性がある(あるいは、このセッションに記憶されるインスタンスから連絡可能である)クラスすべてが含まれることが必要になります。ここに、Terracotta for Springのtc-config.xml設定ファイルが以下のようになっているサンプルがあります。
<application>
<spring>
<jee-application name="swf-sellitem">
<session-support>true</session-support>
<instrumented-classes>
<include>
<class-expression>
org.springframework.webflow.samples.sellitem.Sale
</class-expression>
</include>
</instrumented-classes>
</jee-application>
</spring>
</application>
これでswr-sellitem WARファイルに対するHTTPセッションのクラスタ化が可能になり、計装用のセールクラスが含まれました。
これで終りです。これでほとんどのことを行いました。
Terracottaを有効にする
あと一つしなければならないことがあります。それは、アプリケーションとしてTerracotta for Springのランタイムを有効にすることです。これは、Tomcat Webサーバの起動スクリプトを変更し、以下に示す環境変数をスクリプトの先頭に追加することで実行されます。
set JAVA_OPTS=-Xbootclasspath/p:"%DSO_BOOT_JAR%"
set JAVA_OPTS=%JAVA_OPTS% -Dtc.install-root="%TC_INSTALL_DIR%"
set JAVA_OPTS=%JAVA_OPTS% -Dtc.config="%LOCAL_DIR%\tc-config.xml"
ここで、
- DSO_BOOT_JAR環境変数をboot jarの記憶場所に設定します(この環境変数は、Terracotta for Springをインストールするためのルートフォルダのcommon/lib/dso-bootディレクトリで見つかります)。
- TC_INSTALL_DIR環境変数をTerracotta for Springのインストールルートディレクトリに設定します。
- LOCAL_DIRをtc-config.xmlがあるフォルダに設定します。
Terracotta for Springでクラスタ化のために事前に設定されたSellitemアプリケーションは、下記項の「リリース」から入手可能です。また、難しい設定をすることなく起動できるTomcatクラスタの設定も含まれています。
注記:SpringアプリケーションコンテキストのBeanをクラスタ化する場合は、サービス(Bean)名レベルが扱え、Terracotta for Springの自動組み込み検知機構に依存することができます。たとえば、ほとんどの場合、どのクラスを組み込むかについて気にする必要はありませんが、tc-config.xmlファイルにBean名を明記する場合には、分類統合したいBeanをただ定義するだけです。.
要約
Spring Web Flow は、この記事で知ったような単純なアプリケーションから、多くのリッチページフローにある大規模な企業用アプリケーションまでの、ステートフルな対話型のWebアプリケーションを書き込む優れた方法を提供しています。Terracotta for Spring はSpring Web Flowアプリケーションに高可用性をもたらします。
要約すれば、Terracotta for Springは以下のことを実現しています。
- 普通のSpringアプリケーションを含め、Spring Web Flowベースのアプリケーションに対する耐障害性
- java.lang.Serializableを実行する必要のない、多数分散したノードにわたるアプリケーション状態のトランスペアレントな共有
- リソース調整は、多数分散したノードのいたる所で保持される
- 参照渡し動作は、多数分散したノードのいたる所で保持される
- 既存コードをほとんど何も変更しない宣言型の設定(Springアプリケーションが明示的にステートレスであり、ステートフルにする必要がある場合は除く)
Spring Web FlowとTerracottaを合わせることで、処理状況を把握し、対話型でスケーラブルな高可用性のアプリケーションを記述する新たらしい特性が提供されます。
リソース
Spring Web Flow
メインサイトとダウンロード、試料: http://www.springframework.org/webflow (英語)
デモ用アプリケーション: この記事でひと通りご案内したSellitemアプリケーションは、Spring Web Flow出荷時に同梱されます。
オンラインでSellitemアプリケーションを試す場合: http://spring.ervacon.com/swf-sellitem/ (英語)Terracotta for Spring
クラスタ化しているオープンソースのJVMレベルを実現しているオープンTerracottaプロジェクトの一部であるTerracotta for : http://terracotta.org/ (英語)
ダウンロード: http://terracotta.org/confluence/display/orgsite/Download (英語)
デモ用アプリケーション: デモ用のTerracotta for Springは、事前設定され(Tomcatとロードバランサもバンドルされています)、そのまま直接実行できるSellitemアプリケーションの簡易バージョンとして出荷されます。
資料: http://terracotta.org/confluence/display/docs1/Spring+Quick+Start (英語)
筆者について
Jonas Bonér氏(サイト・英語)は、Terracotta社に勤めています。この会社は、戦略的製品開発と構造技術エバンゲリズムに焦点をあてています。彼は、AspectWerkz AOPフレームワークの創始者で、Eclipse AspectJ 5プロジェクトとその他さまざまなオープンソースプロジェクトのコミッタであり、AOPやJVMレベルのクラスタ化、その他に出てきた技術ついてたびたび語ってくれます。
Eugene Kuleshov氏(ブログ・英語)は、フリーランスのコンサルタントです。彼は、ソフトウェア設計開発や、アプリケーション保護(企業統合(EAI)やメッセージ指向のミドルウェア)を専門に、12年にわたって経験を積んできました。彼は、オープンソースコミュニティーのさまざまなプロジェクトに積極的に寄与してきました。
原文はこちらです:http://www.infoq.com/articles/spring-web-flow-terracotta
(このArticleは2007年4月3日に原文が掲載されました)